アプリケーションでは、カーソルを使用して問合せの結果がスクロールされ、一度に1つの結果行が確認されます。
カーソルの詳細は、『Microsoft ODBC 2.0 Programmer's Reference and SDK Guide』および『Microsoft ODBC 3.0 Software Development Kit and Programmer's Reference』を参照してください。
ODBC設定では、カーソルは常に結果セットに関連付けられています。この関連付けはODBCドライバで行われますが、アプリケーションでSQLSetStmtOptionなどのコールを使用して、カーソルの特性(1回にフェッチする行数など)を制御できます。問合せの結果を取得する手順は、次のとおりです。
次の例では、ODBCでこの手順を実行する方法を示します。わかりやすくするために、エラーのチェックは省略してあります。
注意: | すべてのオープン・カーソルは、トランザクションのコミットまたはロールバック時にクローズされます。 |
#include <sql.h>
SQLHSTMT hstmt;
SQLRETURN rc;
int i;
SQLSMALLINT numCols;
SQLCHAR colname[32];
SQLSMALLINT colnamelen, coltype, scale, nullable;
SQLULEN collen [MAXCOLS];
SQLLEN outlen [MAXCOLS];
SQLCHAR* data [MAXCOLS];
/* other declarations, and program set-up here */
/* Prepare the SELECT statement */
rc = SQLPrepare(hstmt,
(SQLCHAR*) "SELECT * FROM EMP WHERE AGE>20",
SQL_NTS);
/* ... */
/* Determine number of columns in result rows */
rc = SQLNumResultCols(hstmt, &numCols);
/* ... */
/* Describe and bind the columns */
for (i = 0; i < numCols; i++) {
rc = SQLDescribeCol(hstmt,
(SQLSMALLINT) (i + 1),
colname,(SQLSMALLINT)sizeof(colname), &colnamelen, &coltype, &collen[i],
&scale, &nullable);
/* ... */
data[i] = (UCHAR*) malloc (collen[i] +1);
rc = SQLBindCol(hstmt, (SQLSMALLINT) (i + 1),
SQL_C_CHAR, data[i],
COL_LEN_MAX, &outlen[i]);
/* ... */
}
/* Execute the SELECT statement */
rc = SQLExecute(hstmt);
/* ... */
/* Fetch the rows */
if (numCols > 0) {
while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS ||
rc == SQL_SUCCESS_WITH_INFO) {
/* ... "Process" the result row */
} /* end of for-loop */
if (rc != SQL_NO_DATA_FOUND)
fprintf(stderr,
"Unable to fetch the next row\n");
/* Close the cursor associated with the SELECT statement */
rc = SQLFreeStmt(hstmt, SQL_CLOSE);
}